let mut to_avoid = HashSet::new();
let dep = try!(resolve.query(name));
if opts.aggressive {
- fill_with_deps(&resolve, dep, &mut to_avoid);
+ let mut visited = HashSet::new();
+ fill_with_deps(&resolve, dep, &mut to_avoid, &mut visited);
} else {
- to_avoid.insert(dep);
+ to_avoid.insert(dep.get_source_id());
match opts.precise {
Some(precise) => {
sources.push(dep.get_source_id().clone()
}
}
sources.extend(resolve.iter()
- .filter(|p| !to_avoid.contains(p))
- .map(|p| p.get_source_id().clone()));
+ .map(|p| p.get_source_id())
+ .filter(|s| !to_avoid.contains(s))
+ .map(|s| s.clone()));
}
None => sources.extend(package.get_source_ids().into_iter()),
}
return Ok(());
fn fill_with_deps<'a>(resolve: &'a Resolve, dep: &'a PackageId,
- set: &mut HashSet<&'a PackageId>) {
- if !set.insert(dep) { return }
+ set: &mut HashSet<&'a SourceId>,
+ visited: &mut HashSet<&'a PackageId>) {
+ if !visited.insert(dep) { return }
+ set.insert(dep.get_source_id());
match resolve.deps(dep) {
Some(mut deps) => {
for dep in deps {
- fill_with_deps(resolve, dep, set);
+ fill_with_deps(resolve, dep, set, visited);
}
}
None => {}
foo:0.[..].0
"));
})
+
+test!(update_one_dep_in_repo_with_many_deps {
+ let foo = git_repo("foo", |project| {
+ project.file("Cargo.toml", r#"
+ [package]
+ name = "foo"
+ version = "0.5.0"
+ authors = ["wycats@example.com"]
+ "#)
+ .file("src/lib.rs", "")
+ .file("a/Cargo.toml", r#"
+ [package]
+ name = "a"
+ version = "0.5.0"
+ authors = ["wycats@example.com"]
+ "#)
+ .file("a/src/lib.rs", "")
+ }).assert();
+
+ let p = project("project")
+ .file("Cargo.toml", format!(r#"
+ [project]
+ name = "project"
+ version = "0.5.0"
+ authors = []
+ [dependencies.foo]
+ git = '{}'
+ [dependencies.a]
+ git = '{}'
+ "#, foo.url(), foo.url()).as_slice())
+ .file("src/main.rs", "fn main() {}");
+
+ assert_that(p.cargo_process("generate-lockfile"), execs().with_status(0));
+ assert_that(p.process(cargo_dir().join("cargo")).arg("update")
+ .arg("-p").arg("foo"),
+ execs().with_status(0)
+ .with_stdout(format!("\
+Updating git repository `{}`
+", foo.url())));
+})